ASP.NET MVC - .NET Framework Part-7 Routing

MVC में रूटिंग मैकेनिज्म को समझना ज़रूरी है। MVC एप्लीकेशन में, ट्रेडिशनल रूटिंग के अलावा, एट्रिब्यूट बेस्ड रूटिंग भी सपोर्टेड है। हम पहले ही देख चुके हैं कि ActionName एट्रिब्यूट का इस्तेमाल एक्शन मेथड का नाम बदलने के लिए किया जा सकता है। ActionName एट्रिब्यूट का इस्तेमाल मुख्य रूप से यूज़र को यूज़र फ्रेंडली एट्रिब्यूट इस्तेमाल करने में आसानी के लिए किया जाता है।

पारंपरिक(Traditional) रूटिंग मैकेनिज्म में RouteConfig फ़ाइल के अंदर अलग-अलग MapRoute दिए जाते हैं जो एप्लिकेशन में राउटिंग कॉन्फ़िगरेशन के लिए ज़िम्मेदार होता है। 

using System.Web.Mvc;
using System.Web.Routing;
namespace WebApplication
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
}

लेकिन एट्रिब्यूट-बेस्ड रूटिंग में हम एक्शन नाम के ठीक ऊपर रूट एनोटेशन देते हैं जो रूट मैप की तरह काम करता है। नीचे दिया गया उदाहरण बताता है कि MVC एप्लिकेशन में एट्रिब्यूट-बेस्ड रूटिंग का इस्तेमाल कैसे किया जाता है।

using System.Collections.Generic;
using System.Web.Http;

namespace WebApplication8.Controllers
{
    public class ValuesController : ApiController
    {
        // GET api/values
        [HttpGet]
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }

        // GET api/values/5
        public string Get(int id)
        {
            return "value";
        }

        // POST api/values
        [HttpPost]
        public void Post([FromBody] string value)
        {
        }

        // PUT api/values/5
        [HttpPut]
        public void Put(int id, [FromBody] string value)
        {
        }

        // DELETE api/values/5
        [HttpDelete]
        public void Delete(int id)
        {
        }
    }
}

Route सम्बन्धित एट्रिब्यूट को एक्शन नाम के ठीक ऊपर/ पहले लगाया जाता है

राउटिंग क्या है?

हम जानते हैं कि रूट एक पॉइंट से दूसरे पॉइंट तक का वर्चुअल पाथ होता है। वेब टेक्नोलॉजी में, राउटिंग सर्वर के वेब रिसोर्स तक पहुँचने का तरीका है। जब ब्राउज़र किसी वेब रिसोर्स के लिए रिक्वेस्ट करता है, तो वह HTTP रिक्वेस्ट भेजता है जिसमें URL और क्वेरी स्ट्रिंग होती है। URL रिसोर्स तक पहुँचने का राउटिंग पाथ बताता है। हम समझ सकते हैं कि वेब एप्लीकेशन के लिए राउटिंग बहुत ज़रूरी है। 

ट्रेडिशनल वेब एप्लीकेशन (जैसे क्लासिक ASP या ASP.NET) में, वर्चुअल पाथ का इस्तेमाल करके फिजिकल फ़ाइल पाने के लिए राउटिंग का इस्तेमाल किया जाता है। ब्राउज़र का URL वर्चुअल पाथ होता है, जिसे सर्वर वेब रिसोर्स के फिजिकल पाथ से मैप करता है।

MVC में राउटिंग

ASP.NET MVC में राउटिंग, क्लासिक ASP या ASP.NET टेक्नोलॉजी से अलग है क्योंकि इसमें कंट्रोलर और एक्शन मेथड का कॉन्सेप्ट होता है।

ASP.NET MVC में, जब क्लाइंट एप्लीकेशन किसी वेब रिसोर्स (जैसे फ़ाइल) के लिए रिक्वेस्ट करती है, तो वह फिजिकल फ़ाइल के रूप में URL नहीं भेजती है। URL में फ़ाइल का नाम और एक्सटेंशन नहीं दिया जाता है, बल्कि वेब रिसोर्स फ़ाइल पाने के लिए एक बहुत ही एडवांस्ड तरीका अपनाया जाता है।

ASP.NET MVC एप्लीकेशन में एक यूनिक URL पैटर्न होता है जिसे राउटिंग इंजन एनालाइज़ करता है और इस यूनिक URL पाथ के आधार पर फ़ाइल की लोकेशन का पता लगाया जाता है। यह सब ASP.NET MVC एप्लीकेशन के राउटिंग मैकेनिज्म की वजह से संभव है। 

ध्यान रखें कि राउटिंग इंजन सिर्फ़ ASP.NET MVC एप्लीकेशन के लिए ही नहीं है। इसी तरह की MVC-बेस्ड राउटिंग को दूसरे तरह के एप्लीकेशन में भी इस्तेमाल किया जा सकता है।

जैसा कि पहले बताया गया है, जब वेब सर्वर पर HTTP रिक्वेस्ट आती है, तो रिक्वेस्ट को सबसे पहले राउटिंग इंजन एनालाइज़ करता है। राउटिंग इंजन RouteConfig फ़ाइल को पढ़ता है जिसमें अलग-अलग MapRoute मेथड होते हैं। 

हर MapRoute मेथड में रूट के लिए 3 पैरामीटर होते हैं। हर रूट का एक यूनिक नाम और URL पैटर्न होता है, और दिए गए URL पैटर्न के लिए कंट्रोलर, एक्शन मेथड और ऑप्शनल ID पैरामीटर की वैल्यू दी जाती है। 

राउटिंग इंजन के पास एक राउटिंग टेबल होती है। इस टेबल में रूट्स का कलेक्शन होता है और इस रूट कलेक्शन में अलग-अलग MapRoute मेथड से दिए गए सभी रूट्स शामिल होते हैं। राउटिंग इंजन कौन सा रूट चुनेगा, यह क्लाइंट ब्राउज़र से वेब सर्वर को भेजे गए URL पर निर्भर करता है। URL में सबसे पहले राउटिंग इंजन कंट्रोलर का नाम चुनता है, फिर एक्शन का नाम और उसके बाद ऑप्शनल ID पैरामीटर। इन तीनों एलिमेंट्स को हर MapRoute मेथड में दिए गए रूट्स में खोजा जाता है। अगर कोई खास रूट MapRoute मेथड से मैच करता है, तो वह रूट चुना जाता है और उस कंट्रोलर का एक्शन मेथड चलाया जाता है। जब कंट्रोलर का एक्शन मेथड चलता है, तो वह ActionResult टाइप का डेटा रिटर्न करता है। ActionResult टाइप का डेटा कई तरह का हो सकता है, जैसे फ़ाइल, JavaScript, सादा कंटेंट, वेब पेज, पार्शियल व्यू पेज, JSON डेटा, वगैरह।

रूट कलेक्शन, रूट टेबल की एक प्रॉपर्टी या मेथड है। इसमें MapRoute मेथड होता है, जिसका इस्तेमाल RouteConfig क्लास फ़ाइल में नया रूट जोड़ने के लिए किया जाता है।

MapRoute मेथड, RouteConfig फ़ाइल का सबसे ज़रूरी मेथड है। हम अलग-अलग पैरामीटर के आधार पर इस मेथड को ओवरलोड कर सकते हैं। पैरामीटर में नाम, URL पैटर्न और डिफ़ॉल्ट पैरामीटर शामिल हो सकते हैं।

हर रूट का नाम यूनिक (अलग) होता है; इसका मतलब है कि एक MapRoute मेथड को दिया गया नाम दूसरे MapRoute मेथड में दोबारा इस्तेमाल नहीं किया जा सकता। URL पैटर्न, MapRoute मेथड का दूसरा सबसे ज़रूरी पैरामीटर है। इस मेथड में कर्ली ब्रेसिज़ {} में प्लेसहोल्डर वाला एक स्ट्रिंग होता है, और प्लेसहोल्डर की वैल्यू अगले पैरामीटर में दी जाती है।

रूट चुनने का तरीका यह है कि रूटिंग इंजन, RouteConfig फ़ाइल में मौजूद रूट्स के साथ URL को मैच करना शुरू करता है। जो पहला MapRoute मैच हो जाता है, उसे चुन लिया जाता है और बाकी MapRoute मेथड्स को छोड़ दिया जाता है। मान लीजिए हमें कोई रूट बनाना है; अगर पहला MapRoute ज़रूरत से मैच करता है, तो उसे चुन लिया जाता है और उस MapRoute के कंट्रोलर का एक्शन मेथड चलाया जाता है। अगर पहला रूट मैच नहीं करता, तो रूटिंग इंजन अगले MapRoute पर चला जाता है।

आमतौर पर, जब यूज़र एक्शन मेथड और कंट्रोलर का नाम नहीं देता है, तो डिफ़ॉल्ट एक्शन (आमतौर पर होम कंट्रोलर का 'इंडेक्स' मेथड) चलाया जाता है। लेकिन अगर आप चाहते हैं कि URL एरर पेज दिखाए, तो ऐसा भी किया जा सकता है। अगर रूट, रूट कलेक्शन के किसी भी रूट से मैच नहीं करता है, तो एरर पेज या एरर व्यू पेज दिखाया जा सकता है।


Next: ASP.NET MVC - .NET Framework Part-8 Data Binding

टिप्पणियाँ

इस ब्लॉग से लोकप्रिय पोस्ट

Differences between in-process and out-of-process hosting models

Web Fundamental Concepts in Hindi for Beginners - FAQs with their Answers Part-1

Introduction to ASP.NET Core and Web Frameworks